package com.gaojiawei.multiThread17_FutureTask;

import java.util.concurrent.*;

public class L01_FutureTask {
    public static void main(String[] args) {
        //FutureTask Demo
//        futureTaskDemo();

        //重复调用run方法
//        testRunAgain();

        //获取FutureTask的执行结果
//        System.out.println(getFutureTaskResult());

        //测试任务状态
        testControlStatus();
    }

    public static void futureTaskDemo(){
        //基于泛型指定返回类型。
        //在有参构造当中，指定runable和callable任务
        FutureTask<String> futureTask = new FutureTask<>(()->{
            System.out.println("任务开始执行");
            Thread.sleep(10000);
            System.out.println("任务执行完毕");
            return "任务执行完毕";
        });

        //构建线程池
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);

        fixedThreadPool.execute(futureTask);
    }

    public static void testRunAgain(){
        //基于泛型指定返回类型。
        //在有参构造当中，指定runable和callable任务
        FutureTask<String> futureTask = new FutureTask<>(()->{
            System.out.println("任务开始执行");
            Thread.sleep(10000);
            System.out.println("任务执行完毕");
            return "任务执行完毕";
        });

        //构建线程池
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);

        fixedThreadPool.execute(futureTask);

        //FutureTask提供了run方法但是一般不会去直接使用，将任务交给线程池，由线程池去调用run方法。
        //run方法是有执行状态的，对于已经执行run方法的任务，再次调用是会失败的，
        //如果想再次调用需要执行futureTask.runAndSet方法
        futureTask.run();
    }

    public static Object getFutureTaskResult(){
        //基于泛型指定返回类型。
        //在有参构造当中，指定runable和callable任务
        FutureTask<String> futureTask = new FutureTask<>(()->{
            System.out.println("任务开始执行");
            Thread.sleep(3000);
            System.out.println("任务执行完毕");
            return "任务执行完毕";
        });

        //构建线程池
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);

        fixedThreadPool.execute(futureTask);

//        try {
//            //futureTask.get会死等结果
//            return futureTask.get();
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        } catch (ExecutionException e) {
//            e.printStackTrace();
//        }

        try {
            //指定时间为获取到结果会抛出异常。
           return  futureTask.get(3,TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }

        return null;

    }

    public static void testControlStatus(){
        FutureTask<String> futureTask = new FutureTask<>(()->{
            System.out.println("任务开始执行");
            Thread.sleep(3000);
            System.out.println("任务执行完毕");
            return "任务执行完毕";
        });
        //构建线程池
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);

        fixedThreadPool.execute(futureTask);
        System.out.println(futureTask.isDone());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(futureTask.isDone());
    }


}
